#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
#define MaxSize 50
//链栈
//声明链栈
typedef struct linknode{
    ElemType data;//数据域
    struct linknode *next;//指针域
}LinkStNode;//结点类型
//s为头结点指针
//栈空条件：s->next==NULL
//进栈操作：新建结点存放e（由p指向），将p插入头结点之后
//出栈操作：取出首节点的data值删除
//初始化栈
void InitStack(LinkStNode *&s)
{
    s=(LinkStNode *)malloc(sizeof(LinkStNode));
    s->next=NULL;
}
//销毁栈
void DestroyStack(LinkStNode *&s)
{
    LinkStNode *pre=s,*p=s->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
}
//判断是否为空
bool StackEmpty(LinkStNode *s)
{
    return(s->next==NULL);
}
//进栈
bool Push(LinkStNode *&s,ElemType e)
{
    LinkStNode *p;
    p=(LinkStNode *)malloc(sizeof(LinkStNode));//新建结点p
    p->data=e;
    p->next=s->next;
    s->next=p;
    return true;
}
//出栈
bool Pop(LinkStNode *&s,ElemType e)
{
    LinkStNode *p;
    if(s->next==NULL)
        return false;
    p=s->next;
    e=p->data;
    s->next=p->next;
    free(p);
    return true;
}
//取栈顶元素
bool GetTop(LinkStNode *s,ElemType e)
{
    if(s->next==NULL)
        return false;
    e=s->next->data;
    return true;
}
bool Match(char exp[],int n)
{
    int i=0;
    char e;
    bool match=true;
    LinkStNode *st;
    InitStack(st);
    while(i<n && match)
    {
        if(exp[i]=='(')
            Push(st,exp[i]);
        else if(exp[i]==')')
        {
            if(GetTop(st,e)==true)
            {
                if(e!='(')
                    match=false;
                else
                    Pop(st,e);
            }
            else match=false;
        }
        i++;
        if(exp[i]=='[')
            Push(st,exp[i]);
        else if(exp[i]==']')
        {
            if(GetTop(st,e)==true)
            {
                if(e!='[')
                    match=false;
                else
                    Pop(st,e);
            }
            else match=false;
        }
        i++;
        if(exp[i]=='{')
            Push(st,exp[i]);
        else if(exp[i]=='}')
        {
            if(GetTop(st,e)==true)
            {
                if(e!='{')
                    match=false;
                else
                    Pop(st,e);
            }
            else match=false;
        }
        i++;
    }
    if(!=StackEmpty(st))
        match=false;
    DestroyStack(st);
    return match;
}